package com.museum.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.museum.entity.Reservation;

import java.util.List;
import java.util.Map;

public interface ReservationService extends IService<Reservation> {
    /**
     * 分页查询预约列表
     * @param page 分页参数
     * @param status 状态
     * @param date 参观日期，格式：yyyy-MM-dd
     * @return 分页数据
     */
    Page<Reservation> pageList(Page<Reservation> page, Integer status, String date);
    
    /**
     * 更新预约状态
     * @param id 预约ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateStatus(Long id, Integer status);
    
    /**
     * 查询用户的预约列表
     * @param userId 用户ID
     * @return 预约列表
     */
    List<Reservation> getUserReservations(Long userId);
    
    /**
     * 统计指定日期的预约数量
     * @param date 日期，格式：yyyy-MM-dd
     * @return 预约数量
     */
    int countByDate(String date);
    
    /**
     * 获取热门日期统计数据
     * @return 热门日期数据
     */
    List<Map<String, Object>> getPopularDates();
    
    /**
     * 获取指定日期范围内的票务可用情况
     * @param startDate 开始日期，格式：yyyy-MM-dd
     * @param endDate 结束日期，格式：yyyy-MM-dd
     * @return 日期与可用票数的映射，格式：{"2023-04-22": 50}
     */
    Map<String, Integer> getTicketAvailability(String startDate, String endDate);
    
    /**
     * 获取指定日期的可用票数
     * @param date 日期，格式：yyyy-MM-dd
     * @return 可用票数
     */
    Integer getAvailableTickets(String date);
    
    /**
     * 获取可用的时间段
     * @param date 日期，格式：yyyy-MM-dd
     * @return 时间段列表
     */
    List<Map<String, Object>> getAvailableTimeSlots(String date);
    
    /**
     * 保存预约并减少票数
     * @param reservation 预约信息
     * @return 是否成功
     */
    boolean saveAndReduceTickets(Reservation reservation);
    
    /**
     * 保存预约并关联访客
     * @param reservation 预约信息
     * @param visitorIds 访客ID列表
     * @return 是否成功
     */
    boolean saveWithVisitors(Reservation reservation, List<Long> visitorIds);
    
    /**
     * 取消预约并恢复票数
     * @param id 预约ID
     * @return 是否成功
     */
    boolean cancelAndRestoreTickets(Long id);
    
    /**
     * 获取预约相关的访客信息
     * @param reservationId 预约ID
     * @return 访客信息列表
     */
    List<Map<String, Object>> getReservationVisitors(Long reservationId);
    
    /**
     * 获取预约关联的观众详细信息
     * @param reservationId 预约ID
     * @return 观众详细信息列表
     */
    List<Map<String, Object>> getReservationVisitorsDetail(Long reservationId);
    
    /**
     * 减少指定日期的票数
     * @param date 日期，格式：yyyy-MM-dd
     * @param count 减少的票数
     * @return 是否成功
     */
    boolean reduceTickets(String date, int count);
    
    /**
     * 恢复指定日期的票数
     * @param date 日期，格式：yyyy-MM-dd
     * @param count 恢复的票数
     * @return 是否成功
     */
    boolean restoreTickets(String date, int count);
    
    /**
     * 更新预约信息和关联的访客
     * @param reservation 预约信息
     * @param visitorIds 访客ID列表
     * @return 是否成功
     */
    boolean updateWithVisitors(Reservation reservation, List<Long> visitorIds);
} 